package io.github.yotta.export.core.export;

import io.github.yotta.common.api.model.ApiPageRequest;
import io.github.yotta.common.api.model.Paging;
import io.github.yotta.export.core.enums.ExcelType;
import io.github.yotta.export.core.model.ExecuteContext;
import io.github.yotta.export.core.model.XlsxDataExportResult;
import io.github.yotta.export.core.utils.GenericTypeUtils;

/**
 * @author yotta
 * @date 2023/10/24 16:29
 */
@SuppressWarnings({"unused"})
public interface ExcelDataExporter<M, R extends ApiPageRequest> {

    String DEFAULT_SHEET_NAME = "sheet(0)";
    ExcelType DEFAULT_EXCEL_TYPE = ExcelType.XLSX;


    /**
     * 返回导出的模型class类型
     *
     * @return 返回导出的模型class类型
     */
    default Class<M> modelClass() {
        return GenericTypeUtils.getGenericInterfaceType(this.getClass(), ExcelDataExporter.class, 0);
    }


    /**
     * 导出开始的钩子函数，并完成上下文的初始化
     *
     * @param exportParam 导出参数
     */
    default void exportStarted(R exportParam, ExecuteContext context) {

    }

    /**
     * 实现数据分页拆查询逻辑
     *
     * @param exportParam 导出参数
     * @param context     导出过程中的上下文
     * @return 返回要导出的数据
     */
    Paging<M> exportData(R exportParam, ExecuteContext context);

    default void exportFinished(XlsxDataExportResult result, ExecuteContext context) {

    }

    String exportFileName(R exportParam, ExecuteContext context);

    default void exportError(R exportParam, XlsxDataExportResult result, Throwable e) {

    }

    default String sheetName(R exportParam, ExecuteContext context) {
        return DEFAULT_SHEET_NAME;
    }

    default ExcelType excelType(R exportParam, ExecuteContext context) {
        return DEFAULT_EXCEL_TYPE;
    }

}
